const xlsx = require('xlsx');

class ExcelHandler {
    constructor(filePath) {
        this.filePath = filePath;
        this.workbook = null;
    }

    // 读取Excel文件
    readFile() {
        try {
            this.workbook = xlsx.readFile(this.filePath);
            return true;
        } catch (error) {
            console.error('读取Excel文件失败:', error.message);
            return false;
        }
    }

    // 获取所有工作表名称
    getSheetNames() {
        if (!this.workbook) {
            console.error('请先读取Excel文件');
            return [];
        }
        return this.workbook.SheetNames;
    }

    // 读取指定工作表的数据
    getSheetData(sheetName) {
        if (!this.workbook) {
            console.error('请先读取Excel文件');
            return null;
        }

        try {
            const worksheet = this.workbook.Sheets[sheetName];
            return xlsx.utils.sheet_to_json(worksheet);
        } catch (error) {
            console.error('读取工作表数据失败:', error.message);
            return null;
        }
    }

    // 创建新的工作表
    createSheet(sheetName, data) {
        if (!this.workbook) {
            this.workbook = xlsx.utils.book_new();
        }

        try {
            const worksheet = xlsx.utils.json_to_sheet(data);
            xlsx.utils.book_append_sheet(this.workbook, worksheet, sheetName);
            return true;
        } catch (error) {
            console.error('创建工作表失败:', error.message);
            return false;
        }
    }

    // 保存Excel文件
    saveFile(outputPath) {
        if (!this.workbook) {
            console.error('没有可保存的数据');
            return false;
        }

        try {
            xlsx.writeFile(this.workbook, outputPath || this.filePath);
            return true;
        } catch (error) {
            console.error('保存Excel文件失败:', error.message);
            return false;
        }
    }
    // 删除指定工作表中的某一行
    deleteRow(sheetName, rowIndex) {
        if (!this.workbook) {
            console.error('请先读取Excel文件');
            return false;
        }

        try {
            const worksheet = this.workbook.Sheets[sheetName];
            const jsonData = xlsx.utils.sheet_to_json(worksheet);

            // 检查行索引是否有效
            if (rowIndex < 0 || rowIndex >= jsonData.length) {
                console.error('行索引超出范围');
                return false;
            }

            // 删除指定行
            jsonData.splice(rowIndex, 1);

            // 将修改后的数据转换回worksheet
            const newWorksheet = xlsx.utils.json_to_sheet(jsonData);
            this.workbook.Sheets[sheetName] = newWorksheet;

            return true;
        } catch (error) {
            console.error('删除行失败:', error.message);
            return false;
        }
    }
    // 批量删除指定工作表中的多行
    batchDeleteRows(sheetName, rowIndexes) {
        if (!this.workbook) {
            console.error('请先读取Excel文件');
            return false;
        }

        try {
            const worksheet = this.workbook.Sheets[sheetName];
            let jsonData = xlsx.utils.sheet_to_json(worksheet);

            // 对行索引进行排序（从大到小），以避免删除时索引变化的问题
            const sortedIndexes = rowIndexes.sort((a, b) => b - a);

            // 检查所有行索引是否有效
            if (sortedIndexes.some(index => index < 0 || index >= jsonData.length)) {
                console.error('存在无效的行索引');
                return false;
            }

            // 删除指定的所有行
            for (const index of sortedIndexes) {
                jsonData.splice(index, 1);
            }

            // 将修改后的数据转换回worksheet
            const newWorksheet = xlsx.utils.json_to_sheet(jsonData);
            this.workbook.Sheets[sheetName] = newWorksheet;

            return true;
        } catch (error) {
            console.error('批量删除行失败:', error.message);
            return false;
        }
    }
    // 批量添加数据到工作表
    batchAddRows(sheetName, newData) {
        if (!this.workbook) {
            console.error('请先读取Excel文件');
            return false;
        }

        try {
            const worksheet = this.workbook.Sheets[sheetName];
            let jsonData = xlsx.utils.sheet_to_json(worksheet);

            // 将新数据添加到现有数据中
            jsonData = [...jsonData, ...newData];

            // 将修改后的数据转换回worksheet
            const newWorksheet = xlsx.utils.json_to_sheet(jsonData);
            this.workbook.Sheets[sheetName] = newWorksheet;

            return true;
        } catch (error) {
            console.error('批量添加数据失败:', error.message);
            return false;
        }
    }
}

const zhList = require('./public/zh.json')


const one = async () => {
    // 创建ExcelHandler实例
    const handler = new ExcelHandler('./public/(N2501+MOVA+电动牙刷+APP文案)翻译统一管理文档.xlsx');

    handler.readFile()

    const sheetNames = handler.getSheetNames();

    const data = handler.getSheetData(sheetNames[5]);




    const xlxsKeys = data.map((item, index) => {
        return item.key
    });

    // console.log(JSON.stringify(xlxsKeys));

    const zhListKeys = Object.keys(zhList)

    // 查询出xlxsKeys中 没有在 zhListKeys中的key
    const diff = xlxsKeys.reduce((acc, item, index, raw) => {
        if (!zhListKeys.includes(item)) {
            // console.log(item);

            acc.push(index)
        }
        return acc
    }, [])
    // console.log(diff);
    return diff
};

const oneDetele = async (rowsToDelete) => {
    // 创建ExcelHandler实例
    const handler = new ExcelHandler('./public/(N2501+MOVA+电动牙刷+APP文案)翻译统一管理文档.xlsx');

    handler.readFile()

    const sheetNames = handler.getSheetNames();

    const data = handler.getSheetData(sheetNames[5]);

    if (handler.batchDeleteRows(sheetNames[5], rowsToDelete)) {
        handler.saveFile();
        console.log('成功批量删除行');
    }
}

const two = async () => {

    // 创建ExcelHandler实例
    const handler = new ExcelHandler('./public/(N2501+MOVA+电动牙刷+APP文案)翻译统一管理文档.xlsx');

    handler.readFile()

    const sheetNames = handler.getSheetNames();

    const data = handler.getSheetData(sheetNames[5]);

    const xlxsKeys = data.map((item, index) => {
        return item.key
    });

    // console.log(JSON.stringify(xlxsKeys));

    const zhListKeys = Object.keys(zhList)

    // 查询出zhListKeys中 没有在 xlxsKeys 中的key
    const diff = zhListKeys.reduce((acc, item, index, raw) => {
        if (!xlxsKeys.includes(item)) {
            // console.log(item);

            acc.push({
                key: item,
                "中文": zhList[item]
            })
        }
        return acc
    }, [])
    // console.log(JSON.stringify(diff));
    return diff
}

const twoAdd = async (newData) => {
    // 创建ExcelHandler实例
    const handler = new ExcelHandler('./public/(N2501+MOVA+电动牙刷+APP文案)翻译统一管理文档.xlsx');

    handler.readFile();
    const sheetNames = handler.getSheetNames();

    // 准备要添加的新数据
    // const newData = JSON.parse()
    // 添加到第5个工作表（索引4）
    if (handler.batchAddRows(sheetNames[5], newData)) {
        handler.saveFile();
        console.log('成功添加新数据');
    }

}

const three = async () => {
    const handler = new ExcelHandler('./public/(N2501+MOVA+电动牙刷+APP文案)翻译统一管理文档.xlsx');

    handler.readFile();
    const sheetNames = handler.getSheetNames();
    const data = handler.getSheetData(sheetNames[4]);

    const xlxsKeys = data.map((item, index) => {
        return item.key
    });

    const keyCount = xlxsKeys.reduce((acc, key) => {
        acc[key] = (acc[key] || 0) + 1;
        return acc;
    }, {});

        // 找出重复的key（出现次数大于1的）
        const duplicateKeys = Object.entries(keyCount)
        .filter(([key, count]) => count > 1)
        .map(([key, count]) => ({
            key,
            count,
            // 找出所有出现的索引位置
            indexes: xlxsKeys.reduce((acc, curr, index) => {
                if (curr === key) acc.push(index);
                return acc;
            }, [])
        }));


    if (duplicateKeys.length > 0) {
        console.log('发现重复的key：');
        duplicateKeys.forEach(item => {
            console.log(`key: ${item.key}`);
            console.log(`出现次数: ${item.count}`);
            console.log(`出现位置(行号): ${item.indexes.map(i => i + 1).join(', ')}`);
            console.log('------------------------');
        });
    } else {
        console.log('没有发现重复的key');
    }

}

// 翻译文档中 筛选出不是牙刷的key
// one().then(res => {
//     console.log(res);
//     // oneDetele(res)
// })


// 查找翻译文档中 没有在 原始文档中的key
// two().then(res => {
//     console.log(res);
    
//     twoAdd(res)
// })


// three()




const read=()=>{
    const handler = new ExcelHandler('./(N2501+MOVA+电动牙刷+APP文案)0520一稿.xlsx');

    handler.readFile();
    const sheetNames = handler.getSheetNames();
    const data = handler.getSheetData(sheetNames[4]);

    console.log(data);

}

one()